pocketfms_bc.o pocketfms_fp.o pocketfms_wp.o naviguide.o enigma.o \
vpl.o teletype.o jogmap.o bushnell.o bushnell_trl.o wintec_tes.o \
subrip.o garmin_xt.o garmin_fit.o lowranceusr4.o \
- mtk_locus.o googledir.o
+ mtk_locus.o googledir.o mapbar_track.o
FMTS=@FMTS@
--- /dev/null
+/*
+ China mapbar navigation track reader for sonim xp3300
+ it's maybe can used in other demo devices of mapbar navigation
+
+ Copyright (C) 2013 xiao jian cheng, azuresky.xjc@gmail.com
+ Copyright (C) 2001-2013 Robert Lipe, robertlipe@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+
+#include "defs.h"
+#include <QtCore/QDebug>
+
+#define MYNAME "mapbar_track"
+
+static gbfile* fin;
+
+static
+arglist_t mapbar_track_args[] = {
+ ARG_TERMINATOR
+};
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+mapbar_track_rd_init(const char* fname)
+{
+ fin = gbfopen(fname, "r", MYNAME);
+}
+
+static void
+mapbar_track_rd_deinit(void)
+{
+ gbfclose(fin);
+}
+
+static gpsbabel::DateTime
+read_time_t(void)
+{
+ int hour = gbfgetint16(fin);
+ int min = gbfgetint16(fin);
+ int sec = gbfgetint16(fin);
+ int year = gbfgetint16(fin);
+ int mon = gbfgetint16(fin);
+ int mday = gbfgetint16(fin);
+ gpsbabel::DateTime t(QDate(year, mon, mday), QTime(hour, min, sec));
+// qDebug() << t;
+ return t;
+}
+
+static const double DIV_RATE = 100000.0f;
+static waypoint*
+read_waypoint(void)
+{
+ int longitude = gbfgetint32(fin);
+ int latitude = gbfgetint32(fin);
+
+ waypoint* ret = waypt_new();
+
+ ret->latitude = double(latitude)/DIV_RATE;
+ ret->longitude = double(longitude)/DIV_RATE;
+
+ return ret;
+}
+
+static void
+mapbar_track_read(void)
+{
+ route_head* track = route_head_alloc();
+ is_fatal((track == NULL), MYNAME ": memory non-enough");
+ track_add_head(track);
+
+ time_t start_time = read_time_t();
+ (void) start_time; // currently not used.
+ time_t end_time = read_time_t();
+ (void) end_time; // currently not used.
+
+ char name[200] = {0};
+ gbfread((void*)name, 1, 200, fin);
+ // At this point, name is a UCS-16 encoded, zero terminated string.
+ // All our internals use UTF-8 encoding, so convert now.
+ int olen = strlen(name);
+ track->rte_name = cet_str_uni_to_utf8((const short int*) name, olen);
+
+ waypoint* start = read_waypoint();
+ track_add_wpt(track, start);
+
+ waypoint* end = read_waypoint();
+
+ // skip one pair waypoint
+ gbfseek(fin, 4*4, SEEK_CUR);
+ // skip way length
+ gbfseek(fin, 8, SEEK_CUR);
+ // skip fixed value
+ gbfseek(fin, 4, SEEK_CUR);
+
+ int end_flag = gbfgetint32(fin);
+ for (;;) {
+ int length = gbfgetint32(fin);
+ is_fatal((length < 1) || (length > 1600), MYNAME ": get bad buffer length");
+
+ length += 16; // the real length
+ is_fatal((length % 8 != 0), MYNAME ": bad buffer size");
+
+ const int amount = length/8;
+ for (int i = 0; i < amount; ++i) {
+ waypoint* tmp = read_waypoint();
+ track_add_wpt(track, tmp);
+ }
+
+ if (end_flag) {
+ break;
+ }
+ end_flag = gbfgetint32(fin);
+ }
+
+ track_add_wpt(track, end);
+}
+
+// capabilities below means: we can only read trackpoints.
+
+ff_vecs_t mapbar_track_vecs = {
+ ff_type_file,
+ { ff_cap_none, (ff_cap)(ff_cap_read), ff_cap_none },
+ mapbar_track_rd_init,
+ NULL,
+ mapbar_track_rd_deinit,
+ NULL,
+ mapbar_track_read,
+ NULL,
+ NULL,
+ mapbar_track_args,
+ CET_CHARSET_UTF8, 0
+ /* not fixed, can be changed through command line parameter */
+};
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx
+ version="1.0"
+ creator="GPSBabel - http://www.gpsbabel.org"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://www.topografix.com/GPX/1/0"
+ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="23.170610000" minlon="113.295130000" maxlat="23.175130000" maxlon="113.297530000"/>
+ <trk>
+ <name>山顶到豆腐花</name>
+ <trkseg>
+ <trkpt lat="23.175110000" lon="113.295130000">
+</trkpt>
+ <trkpt lat="23.170610000" lon="113.295130000">
+</trkpt>
+ <trkpt lat="23.175130000" lon="113.297530000">
+</trkpt>
+ <trkpt lat="23.175110000" lon="113.295130000">
+</trkpt>
+ <trkpt lat="23.175130000" lon="113.295240000">
+</trkpt>
+ <trkpt lat="23.175090000" lon="113.295350000">
+</trkpt>
+ <trkpt lat="23.175040000" lon="113.295530000">
+</trkpt>
+ <trkpt lat="23.174980000" lon="113.295640000">
+</trkpt>
+ <trkpt lat="23.174940000" lon="113.295740000">
+</trkpt>
+ <trkpt lat="23.174850000" lon="113.295850000">
+</trkpt>
+ <trkpt lat="23.174760000" lon="113.295940000">
+</trkpt>
+ <trkpt lat="23.174620000" lon="113.295980000">
+</trkpt>
+ <trkpt lat="23.174460000" lon="113.296010000">
+</trkpt>
+ <trkpt lat="23.174360000" lon="113.296030000">
+</trkpt>
+ <trkpt lat="23.174200000" lon="113.296060000">
+</trkpt>
+ <trkpt lat="23.174120000" lon="113.296120000">
+</trkpt>
+ <trkpt lat="23.174030000" lon="113.296200000">
+</trkpt>
+ <trkpt lat="23.173940000" lon="113.296390000">
+</trkpt>
+ <trkpt lat="23.173890000" lon="113.296500000">
+</trkpt>
+ <trkpt lat="23.173820000" lon="113.296600000">
+</trkpt>
+ <trkpt lat="23.173720000" lon="113.296570000">
+</trkpt>
+ <trkpt lat="23.173630000" lon="113.296520000">
+</trkpt>
+ <trkpt lat="23.173520000" lon="113.296480000">
+</trkpt>
+ <trkpt lat="23.173380000" lon="113.296490000">
+</trkpt>
+ <trkpt lat="23.173260000" lon="113.296490000">
+</trkpt>
+ <trkpt lat="23.173120000" lon="113.296480000">
+</trkpt>
+ <trkpt lat="23.172940000" lon="113.296470000">
+</trkpt>
+ <trkpt lat="23.172790000" lon="113.296510000">
+</trkpt>
+ <trkpt lat="23.172670000" lon="113.296560000">
+</trkpt>
+ <trkpt lat="23.172580000" lon="113.296660000">
+</trkpt>
+ <trkpt lat="23.172500000" lon="113.296800000">
+</trkpt>
+ <trkpt lat="23.172410000" lon="113.296940000">
+</trkpt>
+ <trkpt lat="23.172320000" lon="113.297080000">
+</trkpt>
+ <trkpt lat="23.172230000" lon="113.297170000">
+</trkpt>
+ <trkpt lat="23.172120000" lon="113.297250000">
+</trkpt>
+ <trkpt lat="23.172030000" lon="113.297330000">
+</trkpt>
+ <trkpt lat="23.171930000" lon="113.297460000">
+</trkpt>
+ <trkpt lat="23.171820000" lon="113.297530000">
+</trkpt>
+ <trkpt lat="23.171870000" lon="113.297370000">
+</trkpt>
+ <trkpt lat="23.171960000" lon="113.297280000">
+</trkpt>
+ <trkpt lat="23.172040000" lon="113.297180000">
+</trkpt>
+ <trkpt lat="23.172090000" lon="113.297060000">
+</trkpt>
+ <trkpt lat="23.172170000" lon="113.296920000">
+</trkpt>
+ <trkpt lat="23.172230000" lon="113.296790000">
+</trkpt>
+ <trkpt lat="23.172270000" lon="113.296660000">
+</trkpt>
+ <trkpt lat="23.172290000" lon="113.296520000">
+</trkpt>
+ <trkpt lat="23.172250000" lon="113.296380000">
+</trkpt>
+ <trkpt lat="23.172240000" lon="113.296240000">
+</trkpt>
+ <trkpt lat="23.172230000" lon="113.296110000">
+</trkpt>
+ <trkpt lat="23.172140000" lon="113.296020000">
+</trkpt>
+ <trkpt lat="23.172050000" lon="113.296120000">
+</trkpt>
+ <trkpt lat="23.172060000" lon="113.296240000">
+</trkpt>
+ <trkpt lat="23.172090000" lon="113.296360000">
+</trkpt>
+ <trkpt lat="23.172120000" lon="113.296470000">
+</trkpt>
+ <trkpt lat="23.172130000" lon="113.296610000">
+</trkpt>
+ <trkpt lat="23.172100000" lon="113.296710000">
+</trkpt>
+ <trkpt lat="23.172050000" lon="113.296820000">
+</trkpt>
+ <trkpt lat="23.171960000" lon="113.296920000">
+</trkpt>
+ <trkpt lat="23.171860000" lon="113.297010000">
+</trkpt>
+ <trkpt lat="23.171750000" lon="113.297100000">
+</trkpt>
+ <trkpt lat="23.171580000" lon="113.297170000">
+</trkpt>
+ <trkpt lat="23.171450000" lon="113.297250000">
+</trkpt>
+ <trkpt lat="23.171310000" lon="113.297270000">
+</trkpt>
+ <trkpt lat="23.171170000" lon="113.297300000">
+</trkpt>
+ <trkpt lat="23.171010000" lon="113.297210000">
+</trkpt>
+ <trkpt lat="23.170850000" lon="113.297170000">
+</trkpt>
+ <trkpt lat="23.170750000" lon="113.297140000">
+</trkpt>
+ <trkpt lat="23.170610000" lon="113.297100000">
+</trkpt>
+ <trkpt lat="23.170640000" lon="113.296990000">
+</trkpt>
+ <trkpt lat="23.170640000" lon="113.295130000">
+</trkpt>
+ <trkpt lat="23.175110000" lon="113.296990000">
+</trkpt>
+ <trkpt lat="23.175110000" lon="113.295130000">
+</trkpt>
+ <trkpt lat="23.170640000" lon="113.296990000">
+</trkpt>
+ <trkpt lat="23.170640000" lon="113.296990000">
+</trkpt>
+ </trkseg>
+</trk>
+</gpx>
t_ = -1;
}
+ DateTime(QDate date, QTime time) : QDateTime(date, time) { }
+
+
// Handle time_tm tm = wpt->creation_time;
operator const time_t() const {
return this->toTime_t();
--- /dev/null
+# Mapbar/Sonim XP330
+rm -f ${TMPDIR}/mapbar.gpx
+gpsbabel -i mapbar -f ${REFERENCE}/track/mapbar.trk -o gpx -F ${TMPDIR}/mapbar.gpx
+compare ${REFERENCE}/track/mapbar~gpx.gpx ${TMPDIR}/mapbar.gpx
extern ff_vecs_t subrip_vecs;
extern ff_vecs_t format_garmin_xt_vecs;
extern ff_vecs_t format_fit_vecs;
+extern ff_vecs_t mapbar_track_vecs;
static
vecs_t vec_list[] = {
"Flexible and Interoperable Data Transfer (FIT) Activity file"
"fit"
},
+ {
+ &mapbar_track_vecs,
+ "mapbar",
+ "Mapbar (China) navigation track for Sonim Xp3300",
+ "trk"
+ },
#endif // MAXIMAL_ENABLED
{
NULL,